package it.csi.finregio.finreges.integration;

import java.util.Collection;
import java.util.ResourceBundle;

import it.crp.dao.DAOService;
import it.crp.dao.config.DbParam;
import it.crp.dao.config.Query;
import it.crp.exception.ServiceException;
import it.csi.finregio.finreges.dto.Classificazione;
import it.csi.finregio.finreges.dto.Direzione;
import it.csi.finregio.finreges.dto.Ente;
import it.csi.finregio.finreges.dto.Settore;
import it.csi.finregio.finreges.dto.TipoRiferimento;
import it.csi.finregio.finreges.util.FinregioResourceBundleLocator;


/**
 * Fornisce i metodi per caricare i tutti dati delle tabelle di supporto dell'applicazione
 * I metodi restituiscono un risultato secco, di tutti i dati. Gli unici dati filtrati sono 
 * quelli riguardanti ENTI, DIREZIONI , SETTORI, CLASSIFICAZIONI e SOTTOCLASSIFICAZIONI
 * @author epelli
 *
 */
public class FinregioService implements Service {

	private DAOService daoService;

	public DAOService getDaoService() {
		
		return daoService==null?new DAOService():daoService;
	}
	
	public Collection getListaClassificazioni() throws ServiceException{
		Query query = new Query("classificazione",getQueriesBundle().getString("classificazione.list"));
		return getListaDati(query);
	}
	
	public Collection getListaSottoclassificazioniByClassificazione(Classificazione classificazione) throws ServiceException{
		Query query = new Query();
		query.setSql(getQueriesBundle().getString("sottoclassificazione.byClassificazione"));
		query.setName("sottoClassificazione");
		DbParam idClass = new DbParam(1,classificazione.getIdClassificazione(),query);
		return getListaDati(query);
	}
	public Collection getListaSottoclassificazioni() throws ServiceException{
		Query query = new Query();
		query.setSql(getQueriesBundle().getString("sottoclassificazione.list"));
		query.setName("sottoClassificazione");
		
		return getListaDati(query);
	}
	
	public Collection getListaEnti() throws ServiceException {
		Query query = new Query("ente",getQueriesBundle().getString("enti.list"));
		return getListaDati(query);
	}

	public Collection getListaAltriEnti() throws ServiceException {
		Query query = new Query("ente",getQueriesBundle().getString("altriEnti.list"));
		return getListaDati(query);
	}
	
	public Collection getListaDirezioni() throws ServiceException{
		Query query = new Query("direzione",getQueriesBundle().getString("direzioni.list"));
		return getListaDati(query);
	}
	public Collection getListaSettori() throws ServiceException{
		Query query = new Query("settore",getQueriesBundle().getString("settori.list"));
		return getListaDati(query);
	}
	public Collection getListaTipoRiferimento() throws ServiceException{
		Query query = new Query("tipoRiferimento",getQueriesBundle().getString("tipiriferimenti.list"));
		return getListaDati(query);
	}
	
	public TipoRiferimento getTipoRiferimentoById(String id) throws ServiceException{
		Query query = new Query("tipoRiferimento",getQueriesBundle().getString("tiporiferimento.byPK"));
		DbParam pId = new DbParam(1,id,query);
		Collection c = getListaDati(query);
		if(c.size()==0){
			return null;
		}
		return (TipoRiferimento) c.toArray()[0];
	}
	
	
	
	public Collection getListaStatoScheda() throws ServiceException{
		Query query = new Query("statoScheda",getQueriesBundle().getString("statiScheda.list"));
		return getListaDati(query);

	}
	public Direzione getDirezioneByProgressivo(String progDirezione) throws ServiceException {
		String sql=getQueriesBundle().getString("direzione.byProgressivo");
		Query query = new Query("direzione",sql);
		DbParam pProgressivo = new DbParam(1,progDirezione,query);
		Collection cDirezione =  getDaoService().find(DBConstants.FINREGIO_DBNAME, query);
		if(cDirezione.size()==0){
			return null;
		}
		Direzione direzione = (Direzione) cDirezione.toArray()[0]; 
		return direzione;
	}

	public Settore getSettoreByProgressivo(String progSettore) throws ServiceException {
		String sql=getQueriesBundle().getString("settore.byProgressivo");
		Query query = new Query("settore",sql);
		DbParam pProgressivo = new DbParam(1,progSettore,query);
		Collection cSettore =  getDaoService().find(DBConstants.FINREGIO_DBNAME, query);
		if(cSettore.size()==0){
			return null;
		}
		Settore settore= (Settore) cSettore.toArray()[0]; 
		return settore;
	}
	
	public Ente getEnteByPK(String idEnte) throws ServiceException{
		String sql=getQueriesBundle().getString("ente.byPK");
		Query query = new Query("ente",sql);
		DbParam pIdEnte = new DbParam(1,idEnte,query);
		Collection cEnte=  getDaoService().find(DBConstants.FINREGIO_DBNAME, query);
		if(cEnte.size()==0){
			return null;
		}
		Ente ente= (Ente) cEnte.toArray()[0]; 
		return ente;
	
	}

	public Ente getAltroEnteByPK(String idEnte) throws ServiceException{
		String sql=getQueriesBundle().getString("altroEnte.byPK");
		Query query = new Query("ente",sql);
		DbParam pIdEnte = new DbParam(1,idEnte,query);
		Collection cEnte=  getDaoService().find(DBConstants.FINREGIO_DBNAME, query);
		if(cEnte.size()==0){
			return null;
		}
		Ente ente= (Ente) cEnte.toArray()[0]; 
		return ente;
	
	}


	public Collection getListaDirezioniByEnte(Ente ente) throws ServiceException{
		Query query = new Query();
		query.setSql(getQueriesBundle().getString("direzioni.byEnte"));
		query.setName("direzione");
		DbParam idEnteParam = new DbParam(1,ente.getIdEnte(),query);
		return getListaDati(query);
	}
	
	public Collection getListaSettoriByEnte(Ente ente) throws ServiceException{
		Query query = new Query();
		query.setSql(getQueriesBundle().getString("settori.byEnte"));
		query.setName("settore");
		DbParam idEnteParam = new DbParam(1,ente.getIdEnte(),query);
		return getListaDati(query);
	}

	public Collection getListaSettoriByDirezione(Direzione direzione) throws ServiceException{
		Query query = new Query();
		query.setSql(getQueriesBundle().getString("settori.byDirezione"));
		query.setName("settore");
		DbParam idDirezioneParam = new DbParam(1,direzione.getIdDirezione(),query);
		return getListaDati(query);
	}

	public Collection getListaCompletaEnti() throws ServiceException {
		Query query = new Query("ente",getQueriesBundle().getString("tuttiGliEnti.list"));
		return getListaDati(query);
	}
	
	public Collection getListaAnni() throws ServiceException{
		Query query = new Query("value",getQueriesBundle().getString("select.listaAnni"));
		return getListaDati(query);
		
	}
	
	private Collection getListaDati(Query query) throws ServiceException {
		DAOService daoService = getDaoService();
		Collection result = daoService.find(DBConstants.FINREGIO_DBNAME, query);
		return result;
	}

	public ResourceBundle getQueriesBundle() {
		// TODO Auto-generated method stub
		return FinregioResourceBundleLocator.getResourceBundle("queries");
	}


}
